# 编译器和选项
CC = gcc
CFLAGS = -Wall -O2 -g
LDFLAGS = -lm

# 目标文件
LIBSBC_SO = libsbc.so
ESBC = msbc_encoder
DSBC = msbc_decoder

# 源代码文件
SRC = src/bits.c src/dsbc.c src/esbc.c src/sbc.c src/wave.c
SRC_LIBSBC = src/sbc.c src/bits.c  # 用于编译 libsbc.so 的源代码

# 包含头文件路径
INCLUDES = -Iinclude

# 默认目标（编译 esbc 和 dsbc）
all: $(ESBC) $(DSBC)

# 生成 esbc 可执行文件
$(ESBC): src/esbc.o src/sbc.o src/bits.o src/wave.o
	$(CC) -o $@ $^ $(LDFLAGS)

# 生成 dsbc 可执行文件
$(DSBC): src/dsbc.o src/sbc.o src/bits.o src/wave.o
	$(CC) -o $@ $^ $(LDFLAGS)

# 生成 libsbc.a 共享库
$(LIBSBC_SO): src/sbc.o src/bits.o
	$(CC) -shared -o $@ $^ $(LDFLAGS)

# 编译 esbc.c
src/esbc.o: src/esbc.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INCLUDES)

# 编译 dsbc.c
src/dsbc.o: src/dsbc.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INCLUDES)

# 编译 sbc.c
src/sbc.o: src/sbc.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INCLUDES)

# 编译 bits.c
src/bits.o: src/bits.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INCLUDES)

# 编译 wave.c
src/wave.o: src/wave.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INCLUDES)

# 清理中间文件和目标文件
clean:
	rm -f src/*.o $(ESBC) $(DSBC) $(LIBSBC_SO)

# 允许用户单独编译 libsbc.so、esbc 和 dsbc
libsbc: $(LIBSBC_SO)

esbc: $(ESBC)

dsbc: $(DSBC)

.PHONY: all clean libsbc esbc dsbc
